package com.irdstudio.efp.batch.service.impl.bd;

import com.gdrcu.efp.cus.common.CusTypeEnum;
import com.irdstudio.basic.framework.core.constant.CurrencyConstant;
import com.irdstudio.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.irdstudio.basic.framework.core.util.DateTool;
import com.irdstudio.basic.framework.core.util.DateUtility;
import com.irdstudio.basic.framework.core.util.StringUtil;
import com.irdstudio.basic.framework.core.util.TimeUtil;
import com.irdstudio.efp.batch.common.constant.BdLoanConstant;
import com.irdstudio.efp.batch.service.facade.bd.BdAccLoanBatchService;
import com.irdstudio.efp.batch.service.util.DueDataUtil;
import com.irdstudio.efp.batch.service.util.SDicMappingUtil;
import com.irdstudio.efp.console.common.ConsoleConstant;
import com.irdstudio.efp.ctr.service.facade.CtrLoanContService;
import com.irdstudio.efp.esb.common.constant.MsLoanConstant;
import com.irdstudio.efp.esb.common.constant.nls.NlsProdCdEnum;
import com.irdstudio.efp.limit.service.facade.LmtPrdContService;
import com.irdstudio.efp.limit.service.vo.LmtPrdContVO;
import com.irdstudio.efp.loan.service.facade.AccLoanService;
import com.irdstudio.efp.loan.service.facade.AccoutErroTempService;
import com.irdstudio.efp.loan.service.facade.BdAccLoanTempService;
import com.irdstudio.efp.loan.service.vo.AccLoanVO;
import com.irdstudio.efp.loan.service.vo.AccoutErroTempVO;
import com.irdstudio.efp.loan.service.vo.BdAccLoanTempVO;
import com.irdstudio.efp.nls.service.facade.BdLoanpayService;
import com.irdstudio.efp.nls.service.facade.NlsApplyInfoService;
import com.irdstudio.efp.nls.service.vo.BdLoanpayVO;
import com.irdstudio.efp.nls.service.vo.NlsApplyInfoVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 
 * 根据百度同步过来的百度借据信息临时表信息修改借据表 <br>
 * 
 * @author ludayong
 * @since 2019年3月7日 上午8:51:49
 * @version 1.0
 */
@Service("bdAccLoanBatchService")
public class BdAccLoanBatchServiceImpl implements BdAccLoanBatchService {

	private static Logger logger = LoggerFactory.getLogger(BdAccLoanBatchServiceImpl.class);

	@Autowired
	@Qualifier("bdAccLoanTempService")
	private BdAccLoanTempService bdAccLoanTempService;// 百度借据信息临时信息

	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;// 同步文件记录异常信息

	@Autowired
	@Qualifier("nlsApplyInfoService")
	private NlsApplyInfoService nlsApplyInfoService;// 网贷申请信息

	@Autowired
	@Qualifier("accLoanService")
	private AccLoanService accLoanService;// 借据信息

	@Autowired
	@Qualifier("ctrLoanContService")
	private CtrLoanContService ctrLoanContService;// 合同信息

	// @Autowired
	// @Qualifier("bdDnDetailTempService")
	// private BdDnDetailTempService bdDnDetailTempService;// 放款明细临时信息
	@Autowired
	@Qualifier("bdLoanpayService")
	private BdLoanpayService bdLoanpayService;// 百度放款通知记录信息

	@Autowired
	@Qualifier("lmtPrdContService")
	private LmtPrdContService lmtPrdContService;

	// @Autowired
	// @Qualifier("lmtRecoverRecordService")
	// private LmtRecoverRecordService lmtRecoverRecordService;

	// 百度账务文件解析地址
	@Value("${analysis.accFilePathBaidu}")
	private String accFilePathBaidu;

	// 数据分隔符
	private static final String DATA_SEPARATOR_C = ",";

	// 借据信息后缀
	private static final String TXT_SUFFIX = ".csv";

	// 日志记录文件后缀
	private static final String LOG_SUFFIX = ".log";

	// 日志记录文件夹
	private static final String LOG_NAME = "log";

	// 异常情况下的借据信息文件名称
	private static final String LOAN_RECORD_NAME = "loan_record";

	/**
	 * 
	 * 根据百度同步过来的百度借据信息临时表信息修改借据表 <br>
	 * 
	 * @return
	 * @throws Exception
	 * @author ludayong
	 * @since 2019年3月4日 下午3:39:30
	 * @version 1.0
	 */
	@Override
	public boolean batchUpdateAccLoan() throws Exception {
		boolean result = false;
		long startTime = System.currentTimeMillis();
		logger.info("同步百度借据临时信息到借据信息表：[" + DateTool.formatDate(new Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始");
		// 可以配置参数
		Integer pageSize = 1000;
		try {
			// 设置分页信息
			BdAccLoanTempVO pageInfo = new BdAccLoanTempVO();
			// 新增或者修改的借据总数量
			int num = 0;
			int page = 1;
			// 对pageSize初始化
			if (pageSize > 0) {
				pageInfo.setSize(pageSize);
			} else {
				pageInfo.setSize(1000);
			}
			// 新增或者修改
			int insertOrUpdateNum = 0;
			// 判断循环次数
			int size = bdAccLoanTempService.queryCount();
			String size_msg = "【借据信息临时表】数据量：" + size;
			logger.info(size_msg, "message{}");
			int loopCount = (size / pageInfo.getSize()) + 1;
			// // 放款明细信息
			// BdDnDetailTempVO bdDnDetailTempVo = null;
			// 百度放款通知记录信息
			BdLoanpayVO inBdLoanpayVO = new BdLoanpayVO();
			// 额度信息
			// LmtPrdContVO lmtPrdContVo = new LmtPrdContVO();
			// 借据号
			String bdLoanId = null;
			// 网贷申请信息
			NlsApplyInfoVO queryNlsApplyInfoVO = null;
			// 额度信息
			LmtPrdContVO queryLmtPrdContVo = null;
			// 单位转换
			final int oneHundred100 = 100;
			for (int i = 0; i < loopCount; i++) {
				String page_msg = "【借据信息临时表】当前页数：" + pageInfo.getPage() + "，分页大小：" + pageInfo.getSize();
				logger.info(page_msg, "message{}");
				// 分页查询【借据临时表】数据
				List<BdAccLoanTempVO> tempList = bdAccLoanTempService.queryByPage(pageInfo);
				if (Objects.nonNull(tempList) && !tempList.isEmpty()) {
					// 需要新增或者修改的借据信息
					List<AccLoanVO> list = new ArrayList<AccLoanVO>();
					for (BdAccLoanTempVO bdAccLoanTempVO : tempList) {
						// 网贷申请信息
						NlsApplyInfoVO inNlsApplyInfoVO = new NlsApplyInfoVO();
						// 额度信息
						LmtPrdContVO inLmtPrdContVo = new LmtPrdContVO();
						// 网贷申请信息
						queryNlsApplyInfoVO = null;
						// 额度信息
						// queryLmtPrdContVo = null;
						insertOrUpdateNum = 0;
						bdLoanId = bdAccLoanTempVO.getLoanId();
						// 百度放款通知记录信息
						inBdLoanpayVO.setLoanId(bdLoanId);
						// 机构金额
						BigDecimal orgEncashAmt = BigDecimal.ZERO;
						// 查询百度放款通知记录信息
						BdLoanpayVO queryBdLoanpayVO = bdLoanpayService.queryByPk(inBdLoanpayVO);
						String orderId = "";
						if (Objects.nonNull(queryBdLoanpayVO)) {
							// 订单号
							orderId = queryBdLoanpayVO.getOrderId();
							// 机构金额
							orgEncashAmt = queryBdLoanpayVO.getEncashAmt() == null ? BigDecimal.ZERO : queryBdLoanpayVO.getEncashAmt();
						}
						// else {
						// String tableName = "bd_loanpay";
						// String errorMsg = "未查询到还款明细分期信息关联的百度放款通知记录信息，放款订单号：" + orderId + "，借据号：" +
						// bdLoanId;
						// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
						// errorMsg);
						// logger.error(errorMsg);
						// }
						// 网贷用信申请流水号
						String applySeq = "";
						// 订单号非空
						if (!StringUtil.isNullorBank(orderId)) {
							// 订单号
							inNlsApplyInfoVO.setBdOrderId(orderId);
							// 查询的网贷申请基本信息
							queryNlsApplyInfoVO = nlsApplyInfoService.queryByPk(inNlsApplyInfoVO);
							if (Objects.nonNull(queryNlsApplyInfoVO)) {
								// 网贷用信申请流水号
								applySeq = queryNlsApplyInfoVO.getApplySeq();
							}
							// else {
							// String tableName = "nls_apply_info";
							// String errorMsg = "未查询到还款明细分期信息关联的网贷申请基本信息，放款订单号：" + orderId + "，借据号：" +
							// bdLoanId;
							// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
							// errorMsg);
							// logger.error(errorMsg);
							// }
						}
						// 网贷用信申请流水号
						if (!StringUtil.isNullorBank(applySeq)) {
							// 网贷申请状态
							String nlsApplyState = "";
							// 放款状态
							String dnSts = "";
							// 产品编号
							String prdCode = "";
							// 授信申请流水号
							String lmtApplySeq = "";
							// 申请金额
							// BigDecimal applyAmt = BigDecimal.ZERO;
							if (Objects.nonNull(queryNlsApplyInfoVO)) {
								// 网贷申请状态
								nlsApplyState = queryNlsApplyInfoVO.getNlsApplyState();
								// 放款状态
								dnSts = queryNlsApplyInfoVO.getDnSts();
								// 产品编号
								prdCode = queryNlsApplyInfoVO.getPrdCode();
								// 授信申请流水号
								lmtApplySeq = queryNlsApplyInfoVO.getLmtApplySeq();
								// 申请金额
								// applyAmt = queryNlsApplyInfoVO.getApplyAmt() == null ? BigDecimal.ZERO :
								// queryNlsApplyInfoVO.getApplyAmt();
							}
							logger.info("根据申请流水号查网贷申请信息，网贷申请状态：" + nlsApplyState + "，放款状态" + dnSts);

							// 对账文件贷款状态
							String loan_status = "";
							loan_status = bdAccLoanTempVO.getLoanStatus();
							// 网贷用信申请流水号非空
							if (!StringUtil.isNullorBank(lmtApplySeq)) {
								// 授信申请流水号
								inLmtPrdContVo.setLmtApplySeq(lmtApplySeq);
								// 额度信息
								queryLmtPrdContVo = lmtPrdContService.queryByPk(inLmtPrdContVo);
							}
							logger.info("网贷申请状态：" + nlsApplyState + "，放款状态：" + dnSts + "，对账文件贷款状态：" + loan_status);
							// 借据金额
							BigDecimal encashAmt = DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getEncashAmt(), oneHundred100);

							// BigDecimal preOccAmt = queryLmtPrdContVo == null ? BigDecimal.ZERO :
							// queryLmtPrdContVo.getPreOccAmt();// 上一次预占用额度
							// BigDecimal occAmt = queryLmtPrdContVo == null ? BigDecimal.ZERO :
							// queryLmtPrdContVo.getOccAmt();// 上一次已占用额度
							// 网贷申请状态 审批通过 放款状态 待放款
							if (MsLoanConstant.NlsApplyStateEnum.PASS.VALUE.equals(nlsApplyState)
									&& MsLoanConstant.DN_STS_3.equals(dnSts)) {
								if (BdLoanConstant.LOAN_STATUS_2.equals(loan_status)) {
									logger.info("网贷申请状态-审批通过，放款状态-待放款，对账文件贷款状态为-已放款");
									// 1、生成借据
									insertOrUpdateNum = insetAccLoan(bdAccLoanTempVO, applySeq);
									logger.info("新增借据方法结束，返回值num：" + insertOrUpdateNum);
									if (insertOrUpdateNum < 1) {
										logger.error("网贷申请状态-审批通过，放款状态-待放款，对账文件贷款状态为-已放款，新增借据信息表出错!");
										String tableName = "acc_loan";
										String errorMsg = "新增借据信息出错，放款订单号：" + orderId + "，借据号：" + bdLoanId;
										// 记录异常信息
										this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
									}
									// 2、更新放款状态为“已放款”；
									updateNlsApplyInfoVO(inNlsApplyInfoVO, bdAccLoanTempVO, applySeq, MsLoanConstant.DN_STS_1);
									if (Objects.nonNull(queryLmtPrdContVo)) {
										if (NlsProdCdEnum.ZXD.getValue().equals(prdCode)) {
											// 3、更新额度状态为“失效”；
											queryLmtPrdContVo.setLmtStatus(ConsoleConstant.LIMIT_STS_03);
											// 最后更新人
											queryLmtPrdContVo.setLastUpdateUser("admin");
											//最近更新时间
											queryLmtPrdContVo.setLastUpdateTime(DateTool.getCurrentDateTime());
										}
										// 3、额度更新
										// 预占用额度=上一次预占用额度-借据金额
										// queryLmtPrdContVo.setPreOccAmt(preOccAmt.subtract(encashAmt));
										// 已占用额度=上一次已占用额度+借据金额
										// queryLmtPrdContVo.setOccAmt(occAmt.add(encashAmt));
										// 可用额度=授信额度-预占用-已占用
										// queryLmtPrdContVo.setAvailAmt(queryLmtPrdContVo.getLmtAmt()
										// .subtract(queryLmtPrdContVo.getPreOccAmt()).subtract(queryLmtPrdContVo.getOccAmt()));
										// 更新授信协议表
										String errorMsg = "网贷申请状态-审批通过，放款状态-待放款，对账文件贷款状态为-已放款，更新授信协议表出错!";
										updateLmtPrdContInfo(queryLmtPrdContVo, orderId, bdLoanId, errorMsg);
									}
								} else if (BdLoanConstant.LOAN_STATUS_3.equals(loan_status)
										|| BdLoanConstant.LOAN_STATUS_4.equals(loan_status)) {
									// 1、生成借据
									insertOrUpdateNum = insetAccLoan(bdAccLoanTempVO, applySeq);
									logger.info("新增借据方法结束，返回值num：" + insertOrUpdateNum);
									if (insertOrUpdateNum < 1) {
										logger.error("网贷申请状态-审批通过，放款状态-待放款，对账文件贷款状态为-已冲正或已撤销，新增借据信息表出错!");
										String tableName = "acc_loan";
										String errorMsg = "新增借据信息出错，放款订单号：" + orderId + "，借据号：" + bdLoanId;
										// 记录异常信息
										this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
									}
									// 2、更新放款状态为“放款失败”
									updateNlsApplyInfoVO(inNlsApplyInfoVO, bdAccLoanTempVO, applySeq, MsLoanConstant.DN_STS_0);
									// if (Objects.nonNull(queryLmtPrdContVo)) {
									// if (NlsProdCdEnum.ZXD.getValue().equals(prdCode)) {
									// // 判断若是额度在有效期内，则更新额度状态为“有效”；
									// if (checkLmtPrdContIsValid(queryLmtPrdContVo)) {
									// queryLmtPrdContVo.setLmtStatus(ConsoleConstant.LIMIT_STS_02);
									// }
									// }
									// // 3、额度更新
									// // 预占用额度=上一次预占用额度-借据金额
									// queryLmtPrdContVo.setPreOccAmt(preOccAmt.subtract(encashAmt));
									// // 已占用额度=上一次已占用额度
									// // lmtPrdContVo.setOccAmt(lmtPrdContVo.getOccAmt());
									// // 可用额度=授信额度-预占用-已占用
									// queryLmtPrdContVo.setAvailAmt(queryLmtPrdContVo.getLmtAmt()
									// .subtract(queryLmtPrdContVo.getPreOccAmt()).subtract(queryLmtPrdContVo.getOccAmt()));
									// // 更新授信协议表
									// String errorMsg = "网贷申请状态-审批通过，放款状态-待放款，对账文件贷款状态为-已冲正或已撤销，更新授信协议表出错!";
									// updateLmtPrdContInfo(queryLmtPrdContVo, orderId, bdLoanId, errorMsg);
									// }
								}
							} else if (MsLoanConstant.NlsApplyStateEnum.PASS.VALUE.equals(nlsApplyState)
									&& MsLoanConstant.DN_STS_1.equals(dnSts)) {
								if (BdLoanConstant.LOAN_STATUS_2.equals(loan_status) || BdLoanConstant.LOAN_STATUS_5.equals(loan_status)
										|| BdLoanConstant.LOAN_STATUS_6.equals(loan_status)) {
									logger.info("网贷申请状态-审批通过，放款状态-已放款，对账文件贷款状态为-已放款、已还款、已结清");
									// "以对账文件为准：
									// 1、更新对账文件即可。是否需要比较借据金额是否一致？答复：需要比对，则用借款金额与支用申请金额比较。若不等则发出告警。
									// 查询借据信息（贷款借据信息表）
									AccLoanVO inAccLoan = new AccLoanVO();
									inAccLoan.setBillNo(bdAccLoanTempVO.getLoanId());
									AccLoanVO queryAccLoan = accLoanService.queryByPk(inAccLoan);
									// 对查询到的借据信息进行修改
									if (queryAccLoan != null) {
										queryAccLoan = initAccLoanInfo(bdAccLoanTempVO, queryAccLoan, applySeq);
										insertOrUpdateNum = accLoanService.updateByPk(queryAccLoan);
										if (insertOrUpdateNum < 1) {
											logger.error("网贷申请状态-审批通过，放款状态-已放款，对账文件贷款状态为-已放款、已还款、已结清，更新借据信息表出错!");
											String tableName = "acc_loan";
											String errorMsg = "更新借据信息出错，放款订单号：" + orderId + "，借据号：" + bdLoanId;
											// 记录异常信息
											this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
										}
									} else {
										// modify by ludayong 2019/11/21 【2019D1127】更新当借据为空时，生成借据信息
										String errorMsg = "网贷申请状态-审批通过，放款状态-已放款，对账文件贷款状态为-已放款、已还款、已结清，新增借据信息表出错";
										insertOrUpdateNum = insetAccLoanAndRecordErrorMsg(bdAccLoanTempVO, applySeq, errorMsg);
										// 记录异常情况下的账务信息
										recordBdAccFile(LOAN_RECORD_NAME, errorMsg, bdAccLoanTempVO);
									}
									// 机构放款金额
									if (orgEncashAmt.compareTo(encashAmt) != 0) {
										String tableName = "bd_loanpay";
										String errorMsg = "机构放款金额与借据金额不相等，放款订单号：" + orderId + "，借据号：" + bdLoanId;
										// 记录异常信息
										this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
									}
								} else if (BdLoanConstant.LOAN_STATUS_3.equals(loan_status)) {
									// 1、更新借据状态为“已冲正”
									// 查询借据信息（贷款借据信息表）
									AccLoanVO inAccLoan = new AccLoanVO();
									inAccLoan.setBillNo(bdAccLoanTempVO.getLoanId());
									AccLoanVO queryAccLoan = accLoanService.queryByPk(inAccLoan);
									// 对查询到的借据信息进行修改
									if (queryAccLoan != null) {
										// 2 已冲正 STD_ZB_ACC_STATUS 台帐状态 1
										queryAccLoan.setAccountStatus("2");// 已冲正
										// last_update_user 最后更新人
										queryAccLoan.setLastUpdateUser("admin");
										// last_update_time 最后更新时间
										queryAccLoan.setLastUpdateTime(DateTool.getCurrentDateTime());
										queryAccLoan.setBizDate(DateUtility.format8To10(bdAccLoanTempVO.getCurDate()));//modify by 2020/03/04 dengqiwen 同步账务日期
										insertOrUpdateNum = accLoanService.updateByPk(queryAccLoan);
										if (insertOrUpdateNum < 1) {
											logger.error("网贷申请状态-审批通过，放款状态-已放款，对账文件贷款状态为-已冲正，更新借据信息表出错!");
											String tableName = "acc_loan";
											String errorMsg = "更新借据信息出错，放款订单号：" + orderId + "，借据号：" + bdLoanId;
											// 记录异常信息
											this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
										}
									} else {
										// modify by ludayong 2019/11/21 【2019D1127】更新当借据为空时，生成借据信息
										String errorMsg = "网贷申请状态-审批通过，放款状态-放款失败，对账文件贷款状态为-已冲正，新增借据信息表出错!";
										insertOrUpdateNum = insetAccLoanAndRecordErrorMsg(bdAccLoanTempVO, applySeq, errorMsg);
										// 记录异常情况下的账务信息
										recordBdAccFile(LOAN_RECORD_NAME, errorMsg, bdAccLoanTempVO);
									}
									// 2、更新放款状态为“放款失败”；
									updateNlsApplyInfoVO(inNlsApplyInfoVO, bdAccLoanTempVO, applySeq, MsLoanConstant.DN_STS_0);
									if (Objects.nonNull(queryLmtPrdContVo)) {
										if (NlsProdCdEnum.ZXD.getValue().equals(prdCode)) {
											// 判断若是额度在有效期内，则更新额度状态为“有效”；
											if (checkLmtPrdContIsValid(queryLmtPrdContVo)) {
												queryLmtPrdContVo.setLmtStatus(ConsoleConstant.LIMIT_STS_02);
												// 最后更新人
												queryLmtPrdContVo.setLastUpdateUser("admin");
												//最近更新时间
												queryLmtPrdContVo.setLastUpdateTime(DateTool.getCurrentDateTime());
											}
										}
										// // 3、额度更新
										// // 预占用额度=上一次预占用额度；
										// // lmtPrdContVo.setPreOccAmt(lmtPrdContVo.getPreOccAmt() + "");
										// // 已占用额度=上一次已占用额度-借据金额
										// queryLmtPrdContVo.setOccAmt(occAmt.subtract(encashAmt));
										// // 可用额度=授信额度-预占用-已占用
										// BigDecimal oldAvailAmt = queryLmtPrdContVo.getAvailAmt();
										// BigDecimal newAvailAmt =
										// queryLmtPrdContVo.getLmtAmt().subtract(queryLmtPrdContVo.getPreOccAmt())
										// .subtract(queryLmtPrdContVo.getOccAmt());
										// queryLmtPrdContVo.setAvailAmt(newAvailAmt);
										String errorMsg = "网贷申请状态-审批通过，放款状态-已放款，对账文件贷款状态为-已冲正，更新授信协议表出错!";
										// // 更新授信协议表
										updateLmtPrdContInfo(queryLmtPrdContVo, orderId, bdLoanId, errorMsg);
										// if (Objects.nonNull(queryNlsApplyInfoVO) && updateLmtNum == 1) {
										// // 4、生成额度恢复记录（答复：需要在表lmt_recover_record中添加“恢复场景”字段）" "以对账文件为准：
										// // 生成额度恢复记录
										// insertLmtRecoverRecordInfo(queryNlsApplyInfoVO, bdAccLoanTempVO, encashAmt,
										// oldAvailAmt,
										// newAvailAmt);
										// }
									}
								}
							} else if (MsLoanConstant.NlsApplyStateEnum.PASS.VALUE.equals(nlsApplyState)
									&& MsLoanConstant.DN_STS_0.equals(dnSts)) {
								if (BdLoanConstant.LOAN_STATUS_3.equals(loan_status) || BdLoanConstant.LOAN_STATUS_4.equals(loan_status)) {
									// if (NlsProdCdEnum.MYD.getValue().equals(prdCode)) {
									// 以对账文件为准：
									// 查询借据信息（贷款借据信息表）
									AccLoanVO inAccLoan = new AccLoanVO();
									inAccLoan.setBillNo(bdAccLoanTempVO.getLoanId());
									AccLoanVO queryAccLoan = accLoanService.queryByPk(inAccLoan);
									// 对查询到的借据信息进行修改
									if (queryAccLoan != null) {
										queryAccLoan = initAccLoanInfo(bdAccLoanTempVO, queryAccLoan, applySeq);
										insertOrUpdateNum = accLoanService.updateByPk(queryAccLoan);
										if (insertOrUpdateNum < 1) {
											logger.error("网贷申请状态-审批通过，放款状态-放款失败，对账文件贷款状态为-已冲正已撤销，更新借据信息表出错!");
											String tableName = "acc_loan";
											String errorMsg = "更新借据信息出错，放款订单号：" + orderId + "，借据号：" + bdLoanId;
											// 记录异常信息
											this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
										}
									} else {
										// 1、生成借据
										insertOrUpdateNum = insetAccLoan(bdAccLoanTempVO, applySeq);
										logger.info("新增借据方法结束，返回值num：" + insertOrUpdateNum);
										if (insertOrUpdateNum < 1) {
											logger.error("网贷申请状态-审批通过，放款状态-放款失败，对账文件贷款状态为-已冲正已撤销，新增借据信息表出错!");
											String tableName = "acc_loan";
											String errorMsg = "新增借据信息出错，放款订单号：" + orderId + "，借据号：" + bdLoanId;
											// 记录异常信息
											this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
										}
									}
									// }
								}
							}
							num += insertOrUpdateNum;
						} else {
							// 存量台帐信息更新或者新增
							AccLoanVO accLoan = new AccLoanVO();
							accLoan = initAccLoanInfo(bdAccLoanTempVO, accLoan, applySeq);
							list.add(accLoan);
						}
					}
					// 存量台帐信息更新或者新增
					if (list != null && !list.isEmpty()) {
						num += accLoanService.insertOrUpdateAccLoan(list);
					}
				}
				pageInfo.setPage(++page);
			}
			String num_msg = "【百度借据表】插入或更新数据处理结果:" + num;
			logger.info(num_msg, "message{}");
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "acc_loan";
			String errorMsg = "同步百度借据临时信息更新借据信息表出错";
			String remark = "同步百度借据临时信息更新借据信息表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
			throw new Exception(remark);
		}
		long endTime = System.currentTimeMillis();
		logger.info("同步百度借据临时信息到借据信息表：[" + DateTool.formatDate(new Date(endTime), DateTool.PATTERN_DATETIME) + "]， 处理结束");
		logger.info("同步百度借据临时信息到借据信息表，耗时：[" + (endTime - startTime) / 1000.0 + "]秒，处理结果[" + result + "]");
		return result;
	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年3月8日 上午8:40:46:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午8:40:46
	 * @date 2019年3月8日 上午8:40:46
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}

	/**
	 * 
	 * 新增借据信息 <br>
	 * 0.1:ludayong:2019年3月8日 下午5:18:44:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 下午5:18:44
	 * @date 2019年3月8日 下午5:18:44
	 * @version 0.1
	 */
	public int insetAccLoan(BdAccLoanTempVO bdAccLoanTempVO, String applySeq) throws Exception {
		int num = 0;
		// 台帐信息
		AccLoanVO accLoan = new AccLoanVO();
		accLoan.setBillNo(bdAccLoanTempVO.getLoanId());
		AccLoanVO queryAccLoan = accLoanService.queryByPk(accLoan);
		// 对查询到的借据信息进行修改
		if (queryAccLoan != null) {
			num = updateAccLoan(bdAccLoanTempVO, queryAccLoan, applySeq);
		} else {
			// 初始化台帐信息
			accLoan = initAccLoanInfo(bdAccLoanTempVO, accLoan, applySeq);
			final String createUser = "admin";
			// create_user 创建人
			accLoan.setCreateUser(createUser);
			// create_time 创建时间
			accLoan.setCreateTime(DateTool.getCurrentDateTime());
			num = accLoanService.insertAccLoan(accLoan);
		}
		return num;
	}

	/**
	 * 
	 * 新增借据信息 <br>
	 * 0.1:ludayong:2019年3月8日 下午5:18:44:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 下午5:18:44
	 * @date 2019年3月8日 下午5:18:44
	 * @version 0.1
	 */
	public int updateAccLoan(BdAccLoanTempVO bdAccLoanTempVO, AccLoanVO accLoan, String applySeq) throws Exception {
		int num = 0;
		// 初始化台帐信息
		accLoan = initAccLoanInfo(bdAccLoanTempVO, accLoan, applySeq);
		num = accLoanService.updateByPk(accLoan);
		return num;
	}

	/**
	 * 
	 * 初始化借据信息 <br>
	 * 0.1:ludayong:2019年3月8日 下午5:18:44:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 下午5:18:44
	 * @date 2019年3月8日 下午5:18:44
	 * @version 0.1
	 */
	public AccLoanVO initAccLoanInfo(BdAccLoanTempVO bdAccLoanTempVO, AccLoanVO accLoan, String applySeq) throws Exception {
		// 单位转换
		final int oneHundred100 = 100;
		// loan_id 借据号 bill_no 借据编号
		accLoan.setBillNo(bdAccLoanTempVO.getLoanId());
		// applySeq 用信申请流水号
		accLoan.setApplySeq(applySeq);
		// loan_id 借据号 ------ cont_no 合同编号
		accLoan.setContNo(applySeq);
		// 取字典库数据CNY 人民币
		accLoan.setCurType(CurrencyConstant.CNY);
		// encash_amt 借据金额 loan_amount 借据金额
		accLoan.setLoanAmount(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getEncashAmt(), oneHundred100));
		// prin_bal 正常本金余额
		BigDecimal prinBal = DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getPrinBal(), oneHundred100);
		// ovd_prin_bal 逾期本金余额
		BigDecimal ovdPrinBal = DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getOvdPrinBal(), oneHundred100);
		// loan_balance 借据余额 = prin_bal + ovd_prin_bal
		BigDecimal loanBalance = prinBal.add(ovdPrinBal);
		accLoan.setLoanBalance(loanBalance);
		// start_date 确认日期 即贷款起息日期 loan_start_date 贷款起始日
		accLoan.setLoanStartDate(DueDataUtil.dateInfoTrans(bdAccLoanTempVO.getStartDate()));
		// end_date 到期日期 该笔借据到期日期 loan_end_date 贷款终止日
		accLoan.setLoanEndDate(DueDataUtil.dateInfoTrans(bdAccLoanTempVO.getEndDate()));
		// int_total 应还利息 rece_int_cumu 应收利息累计
		accLoan.setReceIntCumu(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getIntTotal(), oneHundred100));
		// int_repay 已还利息 actual_int_cumu 实收利息累计
		accLoan.setActualIntCumu(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getIntRepay(), oneHundred100));
		// ovd_int_bal 应收欠息余额 delay_int_cumu 欠息累计
		accLoan.setDelayIntCumu(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getOvdIntBal(), oneHundred100));
		// 借据逾期
//		if (BdLoanConstant.LOAN_FORM_2.equals(bdAccLoanTempVO.getLoanForm())) {
//			// 拖欠本金有值，正常本金为0
//			// unpd_prin_bal decimal(16,2) Y 拖欠本金
//			accLoan.setUnpdPrinBal(loanBalance);
//			accLoan.setNormalBalance(BigDecimal.ZERO);
//		} else {
//			// 正常本金为有值，拖欠本金为0
//			accLoan.setUnpdPrinBal(BigDecimal.ZERO);
//			// normal_balance decimal(16,2) Y 正常贷款余额(元)
//			accLoan.setNormalBalance(loanBalance);
//		}
		// 2020/01/07 modify by ludayong
		// normal_balance 正常贷款余额(元)
		accLoan.setNormalBalance(prinBal);
		// normal_balance 逾期贷款余额(元)
		accLoan.setOverdueBalance(ovdPrinBal);
		// unpd_prin_bal 拖欠本金
		accLoan.setUnpdPrinBal(ovdPrinBal);

		// cur_ovd_terms 当前逾期期数 over_times_current 当前逾期期数
		accLoan.setOverTimesCurrent(bdAccLoanTempVO.getCurOvdTerms());
		// total_ovd_terms 累计逾期期数 over_times_total 累计逾期期数
		accLoan.setOverTimesTotal(bdAccLoanTempVO.getTotalOvdTerms());
		// latest_repay_date 最近还款日期 last_repay_date 最后动账日期
		accLoan.setLatestRepayDate(DueDataUtil.dateInfoTrans(bdAccLoanTempVO.getLastRepayDate()));
		// clear_date 结清日期 settl_date 结清日期
		accLoan.setSettlDate(DueDataUtil.dateInfoTrans(bdAccLoanTempVO.getClearDate()));
		// loan_status 贷款状态 account_status 台账状态
		accLoan.setAccountStatus(accountStatusTrans(bdAccLoanTempVO.getLoanStatus(), bdAccLoanTempVO.getLoanForm()));
		// pnlt_int_total 应还罚息 prin_int_rate_inc 罚息利率增量（拖欠本金的罚息）
		// accLoan.setPrinIntRateInc(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getPnltIntTotal(),
		// oneHundred100));
		// pnlt_int_bal 应收应计罚息余额 unpd_arrs_int_bal 拖欠本金的罚息(应收未收)
		// accLoan.setUnpdArrsIntBal(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getPnltIntBal(),
		// oneHundred100));
		// ovd_prin_bal 逾期本金余额 unpd_prin_bal 拖欠本金
		// accLoan.setUnpdPrinBal(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getOvdPrinBal(),
		// oneHundred100));
		// unpd_arr_prn_bal 应收复利(应收未收) 赋值：0
		accLoan.setUnpdArrPrnBal(BigDecimal.ZERO);
		// act_arrs_int_bal 实收拖欠本金的罚息 pnlt_int_repay 已还罚息
		accLoan.setActArrsIntBal(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getPnltIntRepay(), oneHundred100));
		// act_arr_prn_bal 实收复利 赋值：0
		accLoan.setActArrPrnBal(BigDecimal.ZERO);
		// repay_day 还款日 return_date 还款日
		if (Objects.nonNull(bdAccLoanTempVO.getRepayDay())) {
			accLoan.setReturnDate(bdAccLoanTempVO.getRepayDay().toString());
		}
		// unpd_arr_prn_bal1 应收复利(应收未收) 赋值：0
		accLoan.setUnpdArrPrnBal1(BigDecimal.ZERO);
		// int_bal 应收应计利息余额 int_accr 应收利息（已记未结）
		accLoan.setIntAccr(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getIntBal(), oneHundred100));
		// delay_int_cumu1 应还罚息累计 pnlt_int_total 应还罚息:借据总应还罚息（单位：分）
		accLoan.setDelayIntCumu1(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getPnltIntTotal(), oneHundred100));
		// assure_means_main char(2) Y 主担保方式 赋值：00-信用
		accLoan.setAssureMeansMain(BdLoanConstant.ASSURE_MEANS_MAIN_00);
		// repay_mode 还款方式 repayment_mode 还款方式
		accLoan.setRepaymentMode(repayModeTrans(bdAccLoanTempVO.getRepayMode()));
		// cus_type char(3) Y 客户类型 110 自然人
		accLoan.setCusType(CusTypeEnum.NATURAL_MAN.getCode());
		// repay_cycle 还款周期 repay_freq 还款频率
		accLoan.setRepayFreq(bdAccLoanTempVO.getRepayCycle());
		// loan_use_type 贷款用途 23 消费支出
		accLoan.setLoanUseType(BdLoanConstant.LOAN_USE_TYPE_23);
		// ir_adjust_mode varchar(1) Y 利率调整方式
		accLoan.setIrAdjustMode(BdLoanConstant.IR_ADJUST_MODE_1);
		// channel_code char(3) Y 渠道代码 05度小满
		accLoan.setChannelCode(BdLoanConstant.BD_CHANNEL_NO);
		// overdue_days decimal(16,0) Y 逾期天数
		accLoan.setOverdueDays(bdAccLoanTempVO.getCurOvdDays());
		// cur_term 当前期数 curr_term 当前期数
		accLoan.setCurrTerm(bdAccLoanTempVO.getCurTerm());
		// total_terms 总期数 loan_term 贷款期限
		accLoan.setLoanTerm(bdAccLoanTempVO.getTotalTerms());
		// load_term_type 期限类型
		accLoan.setLoadTermType(BdLoanConstant.TERM_TYPE_M);
		final String createUser = "admin";
		// final String legalOrgName = "广州银行智慧银行";
		// input_br_id 登记机构
		// main_br_id 主管机构
		// legal_org_code 机构法人代码
		// legal_org_name 机构法人名称
		// accLoan.setInputBrId(ESBClientConstance.InstId);
		// accLoan.setMainBrId(ESBClientConstance.InstId);
		// accLoan.setLegalOrgCode(ESBClientConstance.Company);
		// accLoan.setLegalOrgName(legalOrgName);

		// 根据借据编号查询申请表的相关信息
		NlsApplyInfoVO inNlsApplyInfoVO = new NlsApplyInfoVO();
		inNlsApplyInfoVO.setApplySeq(applySeq);
		NlsApplyInfoVO queryNlsApplyInfoVO = null;
		if (!StringUtil.isNullorBank(applySeq)) {
			queryNlsApplyInfoVO = nlsApplyInfoService.queryByPk(inNlsApplyInfoVO);// 查询网贷申请基本信息
		}
		if (queryNlsApplyInfoVO != null) {
			// cus_id 客户编号 赋值
			accLoan.setCusId(queryNlsApplyInfoVO.getCusId());
			// 客户名称 赋值
			accLoan.setCusName(queryNlsApplyInfoVO.getCusName());
			// loan_use_type 贷款用途
			accLoan.setLoanUseType(queryNlsApplyInfoVO.getLoanPurpose());
			// applySeq 用信申请流水号
			accLoan.setApplySeq(queryNlsApplyInfoVO.getApplySeq());
			// 贷款合同编号 赋值
			accLoan.setContNo(queryNlsApplyInfoVO.getApplySeq());
			// 证件类型 赋值
			accLoan.setCertType(queryNlsApplyInfoVO.getCertType());
			// 证件号码 赋值
			accLoan.setCertCode(queryNlsApplyInfoVO.getCertCode());
			// prd_id 产品主键
			accLoan.setPrdId(queryNlsApplyInfoVO.getPrdId());
			// prd_code 产品编号 赋值
			accLoan.setPrdCode(queryNlsApplyInfoVO.getPrdCode());
			// prd_name 产品名称
			accLoan.setPrdName(queryNlsApplyInfoVO.getPrdName());
			// prd_type char(2) Y 产品类型 产品信息：循环、非循环
			accLoan.setPrdType(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_TYPE, queryNlsApplyInfoVO.getPrdCode()));
		}
		// last_update_user 最后更新人
		accLoan.setLastUpdateUser(createUser);
		// last_update_time 最后更新时间
		accLoan.setLastUpdateTime(DateTool.getCurrentDateTime());
		// grace_day 宽限期
		accLoan.setGraceDay(bdAccLoanTempVO.getGraceDay());
		// fund_fee_total 应还借款服务费
		accLoan.setFundFeeTotal(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getFundFeeTotal(), oneHundred100));
		// fund_fee_repay 已还借款服务费
		accLoan.setFundFeeRepay(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getFundFeeRepay(), oneHundred100));
		// charges_total 应还分期手续费
		accLoan.setChargesTotal(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getChargesTotal(), oneHundred100));
		// charges_repay 已还分期手续费
		accLoan.setChargesRepay(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getChargesRepay(), oneHundred100));
		// overdue_total 应还逾期费
		accLoan.setOverdueTotal(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getOverdueTotal(), oneHundred100));
		// overdue_repay 已还逾期费
		accLoan.setOverdueRepay(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getOverdueRepay(), oneHundred100));
		// repay_violate_total 应还提前还款违约金
		accLoan.setRepayViolateTotal(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getRepayViolateTotal(), oneHundred100));
		// repay_violate_repay 已还提前还款违约金
		accLoan.setRepayViolateRepay(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getRepayViolateRepay(), oneHundred100));
		// refund_violate_total 应还退款违约金
		accLoan.setRefundViolateTotal(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getRefundViolateTotal(), oneHundred100));
		// refund_violate_repay 已还退款违约金
		accLoan.setRefundViolateRepay(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getRefundViolateRepay(), oneHundred100));
		// service_total 应还担保费
		accLoan.setServiceTotal(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getServiceTotal(), oneHundred100));
		// service_repay 已还担保费
		accLoan.setServiceRepay(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getServiceRepay(), oneHundred100));
		// int_reduced_am_coupon 优惠券抵扣利息金额
		accLoan.setIntReducedAmCoupon(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getIntReducedAmCoupon(), oneHundred100));
		// pnlt_reduced_amt_coupon 优惠券抵扣罚息金额
		accLoan.setPnltReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getPnltReducedAmtCoupon(), oneHundred100));
		// fund_fee_reduced_amt_coupon 优惠券抵扣借款服务费金额
		accLoan.setFundFeeReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getFundFeeReducedAmtCoupon(), oneHundred100));
		// charges_reduced_amt_coupon 优惠券抵扣分期手续费金额
		accLoan.setChargesReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getChargesReducedAmtCoupon(), oneHundred100));
		// overdue_reduced_amt_coupon 优惠券抵扣逾期费金额
		accLoan.setOverdueReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getOverdueReducedAmtCoupon(), oneHundred100));
		// repay_violate_reduced_amt_coupon "优惠券抵扣提前还款违约金金额"
		accLoan.setRepayViolateReducedAmtCoupon(
				DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getRepayViolateReducedAmtCoupon(), oneHundred100));
		// refund_violate_reduced_amt_coupon 优惠券抵扣退款违约金金额
		accLoan.setRefundViolateReducedAmtCoupon(
				DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getRefundViolateReducedAmtCoupon(), oneHundred100));
		// service_reduced_amt_coupon 优惠券抵扣担保费金额
		accLoan.setServiceReducedAmtCoupon(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getServiceReducedAmtCoupon(), oneHundred100));
		// prin_reduced_amt_manual 手工减免本金金额
		accLoan.setPrinReducedAmtManual(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getPrinReducedAmtManual(), oneHundred100));
		// int_reduced_amt_manual 手工减免利息金额
		accLoan.setIntReducedAmtManual(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getIntReducedAmtManual(), oneHundred100));
		// pnlt_reduced_amt_manual 手工减免罚息金额
		accLoan.setPnltReducedAmtManual(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getPnltReducedAmtManual(), oneHundred100));
		// fund_fee_reduced_amt_manual 手工减免借款服务费金额
		accLoan.setFundFeeReducedAmtManual(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getFundFeeReducedAmtManual(), oneHundred100));
		// charges_reduced_amt_manual 手工减免分期手续费
		accLoan.setChargesReducedAmtManual(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getChargesReducedAmtManual(), oneHundred100));
		// overdue_reduced_amt_manual 手工减免逾期费
		accLoan.setOverdueReducedAmtManual(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getOverdueReducedAmtManual(), oneHundred100));
		// repay_violate_reduced_amt_manual 手工减免提前还款违约金
		accLoan.setRepayViolateReducedAmtManual(
				DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getRepayViolateReducedAmtManual(), oneHundred100));
		// refund_violate_reduced_amt_manual 手工减免退款违约金
		accLoan.setRefundViolateReducedAmtManual(
				DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getRefundViolateReducedAmtManual(), oneHundred100));
		// service_reduced_amt_manual 手工减免担保费
		accLoan.setServiceReducedAmtManual(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getServiceReducedAmtManual(), oneHundred100));
		accLoan.setBizDate(DateUtility.format8To10(bdAccLoanTempVO.getCurDate()));//modify by 2020/03/04 dengqiwen 同步账务日期
		return accLoan;
	}

	/**
	 * 
	 * 更新用信申请信息 <br>
	 * 0.1:ludayong:2019年3月8日 下午5:18:44:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 下午5:18:44
	 * @date 2019年3月8日 下午5:18:44
	 * @version 0.1
	 */
	public void updateNlsApplyInfoVO(NlsApplyInfoVO inNlsApplyInfoVO, BdAccLoanTempVO bdAccLoanTempVO, String applySeq, String dnSts)
			throws Exception {
		// 单位转换
		final int oneHundred100 = 100;
		// 申请流水号
		inNlsApplyInfoVO.setApplySeq(applySeq);
		inNlsApplyInfoVO.setDnSts(dnSts);
		// 如果更新放款状态为放款成功，更新贷款期限、期限类型、放款金额字段信息
		if (MsLoanConstant.DN_STS_1.equals(dnSts)) {
			String loanTerm = Objects.isNull(bdAccLoanTempVO.getTotalTerms()) ? "" : bdAccLoanTempVO.getTotalTerms().toString();
			// loan_term 贷款期限 total_terms 总期数
			inNlsApplyInfoVO.setLoanTerm(loanTerm);
			// loan_term_type 期限类型
			inNlsApplyInfoVO.setLoanTermType("M");
			if (Objects.nonNull(bdAccLoanTempVO.getEncashAmt())) {
				// amount_of_loan 放款金额
				inNlsApplyInfoVO.setAmountOfLoan(DueDataUtil.checkDecimalInfo(bdAccLoanTempVO.getEncashAmt(), oneHundred100).toString());
			}
		}
		final String createUser = "admin";
		// last_update_user 最后更新人
		inNlsApplyInfoVO.setLastModifyUser(createUser);
		// last_update_time 最后更新时间
		inNlsApplyInfoVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 网贷申请信息
		int updateNum = nlsApplyInfoService.updateByPk(inNlsApplyInfoVO);
		if (updateNum < 1) {
			logger.error("网贷申请状态-审批通过，放款状态-待放款，对账文件贷款状态为-已放款，更新网贷申请信息表出错!");
			String tableName = "nls_apply_info";
			String errorMsg = "更新网贷申请信息表出错，用信申请流水号：" + applySeq;
			// 记录异常信息
			this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
		}
	}

	/**
	 *
	 * 更新额度信息 <br>
	 * 0.1:ludayong:2019年5月23日 下午2:33:04:新增 <br>
	 *
	 * @author ludayong
	 * @since 2019年5月23日 下午2:33:04
	 * @date 2019年5月23日 下午2:33:04
	 * @version 0.1
	 */
	public int updateLmtPrdContInfo(LmtPrdContVO queryLmtPrdContVo, String orderId, String bdLoanId, String errorMsg) throws Exception {
		// 更新授信协议表
		int updateLmtNum = lmtPrdContService.updateByPk(queryLmtPrdContVo);
		if (updateLmtNum < 1) {
			logger.error(errorMsg);
			String tableName = "lmt_prd_cont";
			String remark = "更新额度信息表出错，放款订单号：" + orderId + "，借据号：" + bdLoanId;
			// 记录异常信息
			this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
		}
		return updateLmtNum;
	}

	/**
	 * 
	 * 生成额度恢复记录 <br>
	 * 0.1:ludayong:2019年5月23日 下午2:33:04:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月23日 下午2:33:04
	 * @date 2019年5月23日 下午2:33:04
	 * @version 0.1
	 */
	// public void insertLmtRecoverRecordInfo(NlsApplyInfoVO queryNlsApplyInfoVO,
	// BdAccLoanTempVO bdAccLoanTempVO, BigDecimal encashAmt,
	// BigDecimal oldAvailAmt, BigDecimal newAvailAmt) throws Exception {
	// // 4、生成额度恢复记录（答复：需要在表lmt_recover_record中添加“恢复场景”字段）" "以对账文件为准：
	// if (Objects.nonNull(queryNlsApplyInfoVO)) {
	// LmtRecoverRecordVO inLmtRecoverRecordVo = new LmtRecoverRecordVO();
	// // 生成额度恢复记录
	// inLmtRecoverRecordVo.setLmtRecoverSeq(UUIDUtil.getUUID());// 额度恢复流水号
	// inLmtRecoverRecordVo.setLmtApplySeq(queryNlsApplyInfoVO.getApplySeq());//
	// 用信申请流水号
	// inLmtRecoverRecordVo.setAccDate(DueDataUtil.dateInfoTrans(bdAccLoanTempVO.getCurDate()));//
	// 账务日期
	// inLmtRecoverRecordVo.setRecoverType("3");// 额度恢复类型 放款失败
	// inLmtRecoverRecordVo.setTranTime(DateUtility.getCurrAppDateTimeString());//
	// 交易时间
	// inLmtRecoverRecordVo.setRecoverAmt(encashAmt + "");// 恢复金额
	// inLmtRecoverRecordVo.setChannelNo(queryNlsApplyInfoVO.getChannelNo());// 渠道号
	// inLmtRecoverRecordVo.setRecoverBefAmt(oldAvailAmt + "");// 恢复前额度
	// inLmtRecoverRecordVo.setRecoverLatAmt(newAvailAmt + "");// 恢复后额度
	// inLmtRecoverRecordVo.setCreateUser("admin");// 创建人
	// inLmtRecoverRecordVo.setCreateTime(DateUtility.getCurrAppDateTimeString());//
	// 创建时间
	// inLmtRecoverRecordVo.setScene(BaseConstant.SCENE_1);// 恢复场景(0：实时 1：批量)
	// // 额度恢复记录表
	// int insertLmtNum =
	// lmtRecoverRecordService.insertLmtRecoverRecord(inLmtRecoverRecordVo);
	// if (insertLmtNum < 1) {
	// logger.error("网贷申请状态-审批通过，放款状态-已放款，对账文件贷款状态为-已冲正，新增额度恢复记录信息出错!");
	// String tableName = "acc_loan";
	// String errorMsg = "新增额度恢复记录信息出错，放款订单号：" + queryNlsApplyInfoVO.getBdOrderId()
	// + "，借据号：" + bdAccLoanTempVO.getLoanId();
	// // 记录异常信息
	// this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
	// errorMsg);
	// }
	// }
	// }

	/**
	 * 
	 * 台账状态转换<br>
	 * 0.1:ludayong:2019年3月20日 下午7:05:11:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月20日 下午7:05:11
	 * @date 2019年3月20日 下午7:05:11
	 * @version 0.1
	 */
	private String accountStatusTrans(String accountStatus, String loanForm) {
		if (StringUtil.isNullorBank(accountStatus)) {// 台账状态为空
			return "";
		}
		// 新的台账状态
		String newAccountStatus = "";
		// 贷款形态 1：正常、2：逾期
		if ("1".equals(loanForm)) {
			// 0 出帐未确认
			// 1 正常
			// 10 逾期
			// 11 理赔结清
			// 2 冲正
			// 3 失败
			// 4 结清
			// 5 销户
			// 6 垫款
			// 7 已扣款
			// 8 置换
			// 9 核销
			// 12 撤销

			// 1：放款中
			// 2：已放款
			// 3：已冲正
			// 4：已撤销
			// 5：已还款（借据已放款且客户已归还过一次款）
			// 6-：已结清

			switch (accountStatus) {
			case "1":
				newAccountStatus = "";
				break;
			case "2":
				newAccountStatus = "1";
				break;
			case "3":
				newAccountStatus = "2";
				break;
			case "4":
				newAccountStatus = "12";
				break;
			case "5":
				newAccountStatus = "1";
				break;
			case "6":
				newAccountStatus = "4";
				break;
			default:
				newAccountStatus = "";
			}
		} else if ("2".equals(loanForm)) {
			newAccountStatus = "10";
		}
		return newAccountStatus;
	}

	/**
	 * 
	 * 还款方式转换<br>
	 * 0.1:ludayong:2019年3月20日 下午7:05:11:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月20日 下午7:05:11
	 * @date 2019年3月20日 下午7:05:11
	 * @version 0.1
	 */
	private String repayModeTrans(String repayMode) {
		if (StringUtil.isNullorBank(repayMode)) {// 还款方式为空
			return "";
		}
		// 101 只还利息，到期还本
		// 102 等额本息
		// 201 等额本金
		// 202 协议还款
		// FB99 其他

		// 01：等额本金
		// 02：等额本息
		// 03：等本等费
		// 04：先息后本
		// 新的还款方式
		String newRepayMode = "";
		switch (repayMode) {
		case "01":
			newRepayMode = "201";
			break;
		case "02":
			newRepayMode = "102";
			break;
		case "04":
			newRepayMode = "101";
			break;
		default:
			newRepayMode = "FB99";
		}
		return newRepayMode;
	}

	/**
	 * 
	 * 校验额度信息是否在有效期内<br>
	 * 0.1:ludayong:2019年5月23日 上午11:20:06:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月23日 上午11:20:06
	 * @date 2019年5月23日 上午11:20:06
	 * @version 0.1
	 */
	private boolean checkLmtPrdContIsValid(LmtPrdContVO queryLmtPrdContVo) {
		boolean result = false;
		// 到期日期
		String expireDate = queryLmtPrdContVo.getExpireDate();
		// 当前日期
		String currentDate = DateTool.getCurrentDate();
		// 日期非空
		if (!StringUtil.isNullorBank(expireDate) && !StringUtil.isNullorBank(currentDate)) {
			try {
				// 校验额度信息是否在有效期内
				if (TimeUtil.compareDates(expireDate, currentDate) >= 0) {
					result = true;
				}
			} catch (Exception e) {
				e.printStackTrace();
				String tableName = "lmt_prd_cont";
				String errorMsg = "校验额度信息是否在有效期内出错";
				String remark = "校验额度信息是否在有效期内出错，错误信息：" + e.getMessage();
				addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
				logger.error(remark);
			}
		}
		return result;
	}

	/**
	 *
	 * 新增借据信息-异常情况下记录异常信息 <br>
	 * 0.1:ludayong:2019年11月21日 下午11:30:13:新增 <br>
	 *
	 * @author ludayong
	 * @since 2019年11月21日 下午11:30:13
	 * @date 2019年11月21日 下午11:30:13
	 * @version 0.1
	 */
	public int insetAccLoanAndRecordErrorMsg(BdAccLoanTempVO bdAccLoanTempVO, String applySeq, String errorMsg) throws Exception {
		int insertOrUpdateNum = insetAccLoan(bdAccLoanTempVO, applySeq);
		logger.info("新增借据方法结束，返回值num：" + insertOrUpdateNum);
		if (insertOrUpdateNum < 1) {
			logger.error(errorMsg);
			String tableName = "acc_loan";
			String errMsg = "新增借据信息出错，借据号：" + bdAccLoanTempVO.getLoanId();
			// 记录异常信息
			this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
		}
		return insertOrUpdateNum;
	}

	/**
	 *
	 * 记录异常情况下的账务信息<br>
	 * 0.1:ludayong:2019年11月21日 下午11:30:13:新增 <br>
	 *
	 * @author ludayong
	 * @since 2019年11月21日 下午11:30:13
	 * @date 2019年11月21日 下午11:30:13
	 * @version 0.1
	 */
	public void recordBdAccFile(String accRecordName, String errorMsg, BdAccLoanTempVO bdAccLoanTempVO) {
		try {
			// 异常情况下的账务信息存放目录
			String logFileParPath = accFilePathBaidu + LOG_NAME + File.separator;
			File logFileParSrc = new File(logFileParPath);
			if(!logFileParSrc.exists()){
				// 目录不存在则创建
				logFileParSrc.mkdir();
			}
			// 异常情况下的账务信息
			List<BdAccLoanTempVO> accRecordList = new ArrayList<BdAccLoanTempVO>();
			accRecordList.add(bdAccLoanTempVO);

			// 异常情况下的账务信息
			String accRecordAbsPath = logFileParPath + accRecordName + TXT_SUFFIX;
			// 异常情况下的账务信息写入文件
			DueDataUtil.writeTxt(accRecordAbsPath, accRecordList, DATA_SEPARATOR_C);

			// 拼接异常情况下的账务信息记录到文件中
			StringBuffer accFileLog = new StringBuffer();
			accFileLog.append(bdAccLoanTempVO.toString());
			accFileLog.append(DATA_SEPARATOR_C);
			accFileLog.append(errorMsg);
			// 异常情况下的账务日志信息
			String logFileAbsPath = logFileParPath + accRecordName + LOG_SUFFIX;
			// 异常情况下的账务日志信息写入文件
			DueDataUtil.writeOkAppend(logFileAbsPath, accFileLog.toString());
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "acc_loan";
			String errMsg = "记录异常情况下的账务信息出错";
			String remark = "记录异常情况下的账务信息出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errMsg, remark);
			logger.error(remark);
		}
	}
}
